package com.win.oauth.controller;

import com.win.logback.LoggerMessage;
import com.win.oauth.dto.UserDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

@RestController
public class WebSocketController {

    @Autowired
    SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/hello") // @MessageMapping 和 @RequestMapping 功能类似，浏览器向服务器发起请求时，映射到该地址。
    @SendTo("/echo") //如果服务器接受到了消息，就会对订阅了 @SendTo 括号中的地址的浏览器发送消息。
    public LoggerMessage say(@ModelAttribute UserDTO user) throws Exception {
        Thread.sleep(2000);
        return new LoggerMessage("Hello," + user.getName() + "!");
    }

    @MessageMapping("/hello2") // @MessageMapping 和 @RequestMapping 功能类似，浏览器向服务器发起请求时，映射到该地址。
    public void say2() throws Exception {
        simpMessagingTemplate.convertAndSend("/echo", "wo shi ni baba ");
    }


    @MessageMapping("/chat")
    public void handleChat(Principal principal, @RequestParam String msg){

        // 在 SpringMVC 中，可以直接在参数中获得 principal，principal 中包含当前用户信息
        if ("nasus".equals(principal.getName())){
            // 硬编码，如果发送人是 nasus 则接收人是 chenzy 反之也成立。
            // 通过 messageingTemplate.convertAndSendToUser 方法向用户发送信息，参数一是接收消息用户，参数二是浏览器订阅地址，参数三是消息本身
            simpMessagingTemplate.convertAndSendToUser("chenzy",
                    "/notifications",principal.getName()+"-send:" + msg);
        } else {
            simpMessagingTemplate.convertAndSendToUser("nasus",
                    "/notifications",principal.getName()+"-send:" + msg);
        }
    }
}
